// 求出MST中最大的那条边
#include <bits/stdc++.h>
using namespace std;
int a[5000], x[5000], y[5000], f[5000];
struct Edge
{
  int x, y;
  double w;

} edge[1000005];
// 1.两个并查集操作
int find(int x) // 用于查找元素x所在的集合的代表元素（根节点）
{
  if (x == f[x]) // 找到该元素并返回
    return x;
  f[x] = find(f[x]); // 递归查找
  return f[x];
}
int cmp(Edge a, Edge b)
{
  return a.w < b.w;
}
void merge(int x, int y) // 合并两个元素x,y所在集合
{
  int xx = find(x);
  int yy = find(y);
  if (xx != yy) // 如果不相等，将yy的代表元素（根节点）指向xx实现合并
    f[yy] = xx;
}
int main()
{
  int cnt = 0;
  int n, m;
  cin >> m;
  for (int i = 1; i <= m; i++) // 输入每个猴子的跳跃距离
  {
    cin >> a[i];
  }
  cin >> n;
  for (int i = 1; i <= n; i++)
  {
    cin >> x[i] >> y[i]; // n个点的坐标
  }
  for (int i = 1; i <= n; i++)
  {
    f[i] = i;
  }
  for (int i = 1; i <= n; i++)
  {
    for (int j = i + 1; j <= n; j++)
    {
      double w = sqrt((x[i] - y[i]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j])); // 距离公式
      edge[++cnt] = {i, j, w};                                                        // 存储边
    }
  }
  sort(edge + 1, edge + cnt + 1, cmp); // 排序
  int num = 0;
  double max = 0.0;
  for (int i = 1; i <= cnt; i++)
  {
    if (find(edge[i].x) != find(edge[i].y)) // 判断在不在同一个集合里
    {
      merge(edge[i].x, edge[i].y); // 不在就合并
      num++;
      max = max >= edge[i].w ? max : edge[i].w; // 比较当前边的权重 edge[i].w 和之前记录的最大权重 max，并将较大的值赋给 max，最终可以得到合并后形成的最大权重。
    }
    if (num == n - 1)
      break; // 一共处理n-1次，因为有n-1条边就能使图联通
  }
  int ans = 0;
  for (int i = 1; i <= m; i++) // 如果猴子的跳跃距离大于这个最大值，就能在所有叶面上觅食，统计有多少个
    if (a[i] >= max)
      ans++;
  cout << ans << endl;

  return 0;
}